/**
 * 
 */
package com.sicocre.business.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import com.sicocre.beans.Apertura;
import com.sicocre.beans.Banco;
import com.sicocre.beans.Cliente;
import com.sicocre.beans.Detalles;
import com.sicocre.beans.EmpleadoBean;
import com.sicocre.beans.EstadoSolicitud;
import com.sicocre.beans.Pagos;
import com.sicocre.business.dao.IComboDao;

/**
 * @author lserrano
 *
 */

@Repository
public class ComboDaoImpl implements IComboDao{
	
		
	private JdbcTemplate jdbcTemplate;
	
	public static final String SELECT_BANCO = "SELECT * FROM sicocre.bancos where activo= 1";
	public static final String SEL_CAT_BANCO = "SELECT * FROM sicocre.bancos";
	public static final String SELECT_EMPLEADO = "SELECT cve_empleado,nombre_empleado, apater_empleado, amater_empleado FROM sicocre.empleado";
	public static final String SELECT_CLIENTES="SELECT clave_cliente, nombre_cliente, apater_cliente,amater_cliente FROM sicocre.cliente";
	public static final String SEL_CAT_STATUS = "SELECT * FROM sicocre.estados";
	public static final String SEL_STATUS_ID = "SELECT * FROM sicocre.estados where id_status = ?";
	public static final String SELECT_TODO_CLIENTE="SELECT * FROM sicocre.cliente";
	public static final String SELECT_CLIENTE_DETALLE="SELECT * FROM sicocre.cliente where clave_cliente = ?";
	public static final String SELECT_DETALLE = "SELECT * FROM sicocre.detalle d where clave_cliente =? and id_apertura = ?";
	public static final String SELECT_PAGO_CLIENTE ="select a.clave_cliente, a.total, b.monto_pago, b.fch_pago, b.id_apertura, a.id_status, a.folio from apertura a, pago b where a.id_apertura = b.id_apertura and a.clave_cliente = ? order by b.fch_pago";
	public static final String SELECT_NUM_APERTURAS ="select id_apertura, fch_apertura, id_status, folio from apertura where clave_cliente = ?";
	
	
    @Autowired
	public void setDataSource(DataSource ds){
		jdbcTemplate=new JdbcTemplate(ds);
	}
	
    
    
	public ArrayList<Banco> consultaBancos(int n) {
		// TODO Auto-generated method stub
		if (n == 1){
			ArrayList<Banco> consulta = (ArrayList<Banco>)jdbcTemplate.query(SEL_CAT_BANCO,new Object[]{},new RowMapper<Banco>(){
				public Banco mapRow(ResultSet rs, int rowNum) throws SQLException {
					Banco banco = new Banco();
					banco.setIdBanco(rs.getInt(1));
					banco.setNombreBanco(rs.getString(2));
					banco.setActivo(rs.getBoolean(3));
		            
		            return banco;
		        }					    
		});	    
		return consulta;	
		
		}else{ 	
		
		ArrayList<Banco> consulta = (ArrayList<Banco>)jdbcTemplate.query(SELECT_BANCO,new Object[]{},new RowMapper<Banco>(){
				 
			public Banco mapRow(ResultSet rs, int rowNum) throws SQLException {
					Banco banco = new Banco();
					banco.setIdBanco(rs.getInt(1));
					banco.setNombreBanco(rs.getString(2));
					banco.setActivo(rs.getBoolean(3));
		            
		            return banco;
		        }					    
		});	    
		return consulta;
		}
	}
	
	
	public ArrayList<EmpleadoBean> consultaEmpleado() {
		// TODO Auto-generated method stub
		ArrayList<EmpleadoBean> consultaEmp = (ArrayList<EmpleadoBean>) jdbcTemplate.query(SELECT_EMPLEADO,new Object[]{},new RowMapper<EmpleadoBean>(){
				    public EmpleadoBean mapRow(ResultSet rs, int rowNum) throws SQLException {
				    EmpleadoBean emp = new EmpleadoBean();
					emp.setCveEmpleado(rs.getInt(1));
					emp.setNombre(rs.getString(2) + " " + rs.getString(3) + " " + rs.getString(4));					
		            return emp;
		        }					    
		});	    
		return consultaEmp;
	}
	
	public ArrayList<Cliente> consultaCliente() {
		// TODO Auto-generated method stub
		ArrayList<Cliente> consultaClientes = (ArrayList<Cliente>) jdbcTemplate.query(SELECT_CLIENTES,new Object[]{},new RowMapper<Cliente>(){
				    public Cliente mapRow(ResultSet rs, int rowNum) throws SQLException {
				    	Cliente cliente = new Cliente();
					cliente.setClave(rs.getInt(1));
					cliente.setNombre(rs.getString(3) + " " + rs.getString(4) + " " +rs.getString(2));					
		            return cliente;
		        }					    
		});	    
		return consultaClientes;
	}
	
	
	public ArrayList<EstadoSolicitud> consultaEstados() {
		// TODO Auto-generated method stub
		
			ArrayList<EstadoSolicitud> consulta = (ArrayList<EstadoSolicitud>)jdbcTemplate.query(SEL_CAT_STATUS,new Object[]{},new RowMapper<EstadoSolicitud>(){
				public EstadoSolicitud mapRow(ResultSet rs, int rowNum) throws SQLException {
					EstadoSolicitud status = new EstadoSolicitud();
					status.setIdStatus(rs.getInt(1));
					status.setDescripcionStatus(rs.getString(2));
					status.setActivo(rs.getBoolean(3));
		            
		            return status;
		        }					    
		});	    
		return consulta;	
	
	}
	
	public ArrayList<Cliente> consultaClienteB() {
		// TODO Auto-generated method stub
		ArrayList<Cliente> consultaClientes = (ArrayList<Cliente>) jdbcTemplate.query(SELECT_TODO_CLIENTE,new Object[]{},new RowMapper<Cliente>(){
				    public Cliente mapRow(ResultSet rs, int rowNum) throws SQLException {
				    	Cliente cliente = new Cliente();
					cliente.setClave(rs.getInt(1));
					cliente.setNombre(rs.getString(2));	
					cliente.setaPaterno(rs.getString(3));
					cliente.setaMaterno(rs.getString(4));
					cliente.setListAperturas(conNumAperturas(rs.getInt(1)));
		            return cliente;
		        }					    
		});	    
		return consultaClientes;
	}
	
	public Cliente consultaClienteDet(int cve) {
		// TODO Auto-generated method stub
		Cliente consultaClientes = (Cliente) jdbcTemplate.query(SELECT_CLIENTE_DETALLE,new Object[]{cve},new ResultSetExtractor<Cliente>(){
			  @Override 	    
			   public Cliente extractData(ResultSet rs) throws SQLException,
				DataAccessException {
				    	Cliente cliente = new Cliente();
				    if(rs.next()){
					cliente.setClave(rs.getInt(1));
					cliente.setNombre(rs.getString(2));	
					cliente.setaPaterno(rs.getString(3));
					cliente.setaMaterno(rs.getString(4));
					cliente.setSexo(rs.getString(5));
					cliente.setEdoCivil(rs.getString(6));
					cliente.setFechaNacimiento(rs.getDate(7));
					cliente.setLugarNacimiento(rs.getString(8));
					cliente.setNacionalidad(rs.getString(9));
					cliente.setProfesion(rs.getString(10));
					cliente.setRfc(rs.getString(11));
					cliente.setEmpresa(rs.getString(12));
					cliente.setPuesto(rs.getString(13));
					cliente.setTelefonoCasa(rs.getString(14));
					cliente.setCelular(rs.getString(15));
					cliente.setMail(rs.getString(16));
					cliente.setOficina(rs.getString(17));
					cliente.setRazonSocial(rs.getString(18));
					cliente.setMedio(rs.getString(19));
					cliente.setDomicilio(rs.getString(20));
					cliente.setCiudad(rs.getString(21));
					cliente.setEstadoCliente(rs.getString(22));
					cliente.setCodigoPostal(rs.getInt(23));
				    }
		            return cliente;
		        }					    
		});	    
		return consultaClientes;
	}
	
	
	public ArrayList<Detalles> consultaDetalle(int cve, int id) {
		// TODO Auto-generated method stub
		ArrayList<Detalles> consultaDetail= (ArrayList<Detalles>) jdbcTemplate.query(SELECT_DETALLE,new Object[]{cve, id},new RowMapper<Detalles>(){
				    public Detalles mapRow(ResultSet rs, int rowNum) throws SQLException {
				    	Detalles detail = new Detalles();
				    	detail.setIdDetalle(rs.getInt(1));
				    	detail.setDescripcionDetalle(rs.getString(2));	
				    	detail.setFecha(rs.getDate(3));
				    	detail.setCliente(traeCliente(rs.getInt(4)));
		            return detail;
		        }					    
		});	    
		return consultaDetail;
	}
	
	public Cliente traeCliente(int cve){
		Cliente cliente = new Cliente();
		cliente.setClave(cve);		
		return cliente;
	}
	
	
	public ArrayList<Apertura> consultaPago(int cliente){
		
		ArrayList<Apertura> consultaPagos = (ArrayList<Apertura>)jdbcTemplate.query(SELECT_PAGO_CLIENTE,new Object[]{cliente},new RowMapper<Apertura>(){
			 
			public Apertura mapRow(ResultSet rs, int rowNum) throws SQLException {
					Apertura apertura = new Apertura();
					Cliente cliente = new Cliente();					
					Pagos pago = new Pagos();
					cliente.setClave(rs.getInt(1));
					apertura.setCliente(cliente);
					apertura.setTotal(rs.getDouble(2));
					pago.setMonto(rs.getDouble(3));
					pago.setFchPago(rs.getDate(4));
					apertura.setPagos(pago);
					apertura.setIdApertura(rs.getInt(5));					
					apertura.setStatus(getStatus(rs.getInt(6)));
					apertura.setFolio(rs.getString(7));
		            
		            return apertura;
		        }					    
		});	    
		return consultaPagos;
				
	}
	
	public EstadoSolicitud getStatus(int id){
		
		EstadoSolicitud consultaStatus = (EstadoSolicitud) jdbcTemplate.query(SEL_STATUS_ID,new Object[]{id},new ResultSetExtractor<EstadoSolicitud>(){
			  @Override 	    
			   public EstadoSolicitud extractData(ResultSet rs) throws SQLException,
				DataAccessException {
				  EstadoSolicitud status = new EstadoSolicitud();
				    if(rs.next()){
					    status.setIdStatus(rs.getInt(1));
				    	status.setDescripcionStatus(rs.getString(2));						
				    }
		            return status;
		        }					    
		});	    
		return consultaStatus;
		
		
	}
	
	
	
	
public ArrayList<Apertura> conNumAperturas(int cliente){
		
		ArrayList<Apertura> aperturasXcliente = (ArrayList<Apertura>)jdbcTemplate.query(SELECT_NUM_APERTURAS,new Object[]{cliente},new RowMapper<Apertura>(){
			 
			public Apertura mapRow(ResultSet rs, int rowNum) throws SQLException {
					Apertura apertura = new Apertura();						
					apertura.setIdApertura(rs.getInt(1));
					apertura.setFchApertura(rs.getDate(2));					
					apertura.setStatus(getStatus(rs.getInt(3)));
					apertura.setFolio(rs.getString(4));
					
		            return apertura;
		        }					    
		});	    
		return aperturasXcliente;
				
	}
	
	

}
